import 'dayjs/locale/zh-cn';

import type { Dayjs } from 'dayjs';
import dayjs, { isDayjs } from 'dayjs';
import advancedFormat from 'dayjs/plugin/advancedFormat';
import customParseFormat from 'dayjs/plugin/customParseFormat';
import type { App } from 'vue';

dayjs.extend(advancedFormat);
dayjs.extend(customParseFormat);
dayjs.locale('zh-cn');

/**
 * 尝试将任意数据转换成dayjs,如果转换失败，将直接返回dayjs()
 * @param value
 * @returns
 */
export function toDayjs(value?: any): Dayjs {
  if (!value) {
    return dayjs();
  }
  let date: Dayjs;
  if (isDayjs(value)) {
    date = value;
  } else if (value instanceof Date) {
    date = dayjs(value);
  } else if (+value) {
    const timestamp = Number.parseInt(value);
    date = dayjs(timestamp);
  } else {
    date = dayjs(value);
  }
  return date;
}

/**
 * dayjs插件
 * 创建后,vue实例上会挂上一个$any2darjs
 * @returns
 */
export function createToDayjsPlugin() {
  return {
    install(app: App) {
      Object.defineProperty(app.config.globalProperties, '$toDayjs', {
        enumerable: true,
        get: () => toDayjs,
      });
    },
  };
}

declare module '@vue/runtime-core' {
  export interface ComponentCustomProperties {
    $toDayjs: typeof toDayjs;
  }
}
